/**
 * 给定[0, N)的排列，然后再给出Mex数组。
 * Mex[i] = mex(P[0...i])
 * 问满足Mex数组的排列的数量
 * 首先确定解存在的条件，Mex数组必须是不降的数组，且最后一个数必须是N。
 * 然后再考虑对Mex数组的每一段：假设是 zxxxxxxy， 一共c个x
 * 可以确定y位置上必须是x，且第一个x对应的位置上必须是z，因此一共有c-1个位置可以选择
 * 令此时可以用的数的数量是m个，因此累乘 Pailie(m, c - 1)即可。    
 */
#include <bits/stdc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using Real = long double;

llt const MOD = 998244353LL;

llt qpow(llt a, llt n){
    llt ans = 1;
    while(n){
        if(n & 1) ans = ans * a % MOD;
        a = a * a % MOD;
        n >>= 1;
    }
    return ans;
}

llt inv(llt x) {return qpow(x, MOD - 2LL);}

vector<llt> Fac, IFac;

int N;
vi P;

llt pailie(int n, int m){
    if(m > n) return 0;
    return Fac[n] * IFac[n - m] % MOD;
}

llt proc() {
    for(int i=1;i<N;++i){
        if(P[i - 1] > P[i]) return 0LL;
    }
    if(P[N - 1] != N) return 0LL;

    if(1 == N) return 1LL;

    int k = N - 1;
    llt ans = 1;
    int used = 0;
    while(1){
        int o = 0;
        while(k - o >= 0 and P[k] == P[k - o]) o += 1;

        int ava = N - P[k];
        ava -= used;
        int c = o - 1;        
        ans = ans * pailie(ava, c) % MOD;
        used += o;

        if((k -= o) < 0) break;
    }
    return ans;
}

void work(){
    cin >> N;
    P.assign(N, {});
    for(auto & i : P) cin >> i;
    
    cout << proc() << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

    Fac.assign(300000+10, {});
    IFac.assign(300000+10, {});
    Fac[0] = Fac[1] = 1LL;
    for(int i=2;i<300000+10;++i) Fac[i] = Fac[i - 1] * i % MOD;
    IFac[300000 + 9] = inv(Fac[300000 + 9]);
    for(int i=300000+8;i>=0;--i) IFac[i] = IFac[i + 1] * (i + 1) % MOD;
    assert(1 == IFac[0] and 1 == IFac[1]);

    int nofkase = 1;
    cin >> nofkase;
    while(nofkase--) work();
    return 0;
}
